package com.logos.musicframe.utils;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.util.Base64;

/**
 * 加密工具类，提供AES加密和解密功能
 * 
 * @author logos
 * @version v1.0
 * @date 2025/6/14
 */
public class EncryptionUtil {
    
    // 加密算法
    private static final String ALGORITHM = "AES";
    // 加密模式和填充方式
    private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
    // 默认密钥 (实际应用中应该从配置文件或环境变量中获取)
    private static final String DEFAULT_SECRET_KEY = "MusicFrameSecKey";
    // 默认初始化向量 (16字节)
    private static final String DEFAULT_IV = "MusicFrameSecIv1";
    
    /**
     * 使用默认密钥加密字符串
     *
     * @param plainText 需要加密的字符串
     * @return 加密后的Base64编码字符串
     */
    public static String encrypt(String plainText) {
        return encrypt(plainText, DEFAULT_SECRET_KEY, DEFAULT_IV);
    }
    
    /**
     * 使用指定密钥加密字符串
     *
     * @param plainText 需要加密的字符串
     * @param secretKey 密钥
     * @param iv 初始化向量
     * @return 加密后的Base64编码字符串
     */
    public static String encrypt(String plainText, String secretKey, String iv) {
        try {
            // 生成密钥
            SecretKeySpec keySpec = generateKey(secretKey);
            // 初始化向量
            IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            
            // 创建加密器
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);
            
            // 加密
            byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));
            
            // Base64编码
            return Base64.getEncoder().encodeToString(encryptedBytes);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 使用默认密钥解密字符串
     *
     * @param encryptedText 加密后的Base64编码字符串
     * @return 解密后的字符串
     */
    public static String decrypt(String encryptedText) {
        return decrypt(encryptedText, DEFAULT_SECRET_KEY, DEFAULT_IV);
    }
    
    /**
     * 使用指定密钥解密字符串
     *
     * @param encryptedText 加密后的Base64编码字符串
     * @param secretKey 密钥
     * @param iv 初始化向量
     * @return 解密后的字符串
     */
    public static String decrypt(String encryptedText, String secretKey, String iv) {
        try {
            // 生成密钥
            SecretKeySpec keySpec = generateKey(secretKey);
            // 初始化向量
            IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes(StandardCharsets.UTF_8));
            
            // 创建解密器
            Cipher cipher = Cipher.getInstance(TRANSFORMATION);
            cipher.init(Cipher.DECRYPT_MODE, keySpec, ivSpec);
            
            // Base64解码
            byte[] encryptedBytes = Base64.getDecoder().decode(encryptedText);
            
            // 解密
            byte[] decryptedBytes = cipher.doFinal(encryptedBytes);
            
            return new String(decryptedBytes, StandardCharsets.UTF_8);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
    
    /**
     * 根据密钥字符串生成SecretKeySpec
     *
     * @param secretKey 密钥字符串
     * @return SecretKeySpec对象
     */
    private static SecretKeySpec generateKey(String secretKey) throws Exception {
        // 使用SHA-1安全散列算法和SecureRandom生成密钥
        SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
        secureRandom.setSeed(secretKey.getBytes());
        
        // 创建AES密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(ALGORITHM);
        keyGenerator.init(128, secureRandom);
        
        // 生成密钥
        SecretKey key = keyGenerator.generateKey();
        
        return new SecretKeySpec(key.getEncoded(), ALGORITHM);
    }
    
    /**
     * 加密手机号，只显示前三位和后四位
     *
     * @param phoneNumber 手机号
     * @return 加密后的手机号，格式如：138****1234
     */
    public static String maskPhoneNumber(String phoneNumber) {
        phoneNumber = decrypt(phoneNumber);
        if (phoneNumber == null || phoneNumber.length() != 11) {
            return phoneNumber;
        }
        return phoneNumber.substring(0, 3) + "****" + phoneNumber.substring(7);
    }
    
    /**
     * 加密邮箱，只显示@前面的前三位和@后面的所有内容
     *
     * @param email 邮箱
     * @return 加密后的邮箱，格式如：abc****@example.com
     */
    public static String maskEmail(String email) {
        if (email == null || !email.contains("@")) {
            return email;
        }
        
        int atIndex = email.indexOf('@');
        if (atIndex <= 3) {
            return email.substring(0, 1) + "****" + email.substring(atIndex);
        } else {
            return email.substring(0, 3) + "****" + email.substring(atIndex);
        }
    }
} 